<?php
/*
 * description：
 * author：wh
 * email：
 * createTime：{2020/4/3} {9:23} 
 */

namespace libraries;


/**
 * 上传组件
 * 支持单图，多图，单文件，多文件
 * Class FileUpload
 * @package libraries
 */
class FileUpload
{
    //文件扩展
    protected static $file_ext = 'ico,jpg,jpeg,png,gif,pdf,zip,rar,xls,xlsx,doc,docx';
    //图片扩展
    protected static $img_ext = 'ico,jpg,jpeg,png,gif';
    /**
     * desc：单图
     * author：wh
     * @param string $file_upload_name 表单文件元素name值
     * @param int $size 大小,默认2M
     * @param string $ext 允许的扩展
     * @return array
     */
    static function image($file_upload_name = 'file_upload', $size=10, $ext=''){
        // 获取表单上传文件 例如上传了001.jpg
        $file = request()->file($file_upload_name);
        // 移动到框架应用根目录/uploads/ 目录下
        $outer_req_url = '/static/upload/image/'.date('Y-m-d');
        $upload_dir = config('app.ROOT_PATH_PRO').'public'.$outer_req_url;
        if(!is_dir($upload_dir)){
            mkdir($upload_dir, 0777, true);
        }
        if(empty($file)){
            return Tools::set_result(1, '上传文件不存在');
        }

        if(empty($ext)) $ext = self::$img_ext;

        $info = $file->validate(['size'=>$size * 1024 * 1024, 'ext'=>$ext])->move($upload_dir);
        if($info){
            //原文件名
            $source_file_name = $info->getInfo('name');

            //文件类型
            $file_type = $info->getInfo('type');

            // 输出扩展名 jpg
            $extension = $info->getExtension();

            // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
            $save_name = $info->getSaveName();

            // 输出 42a79759f284b767dfcb2a0197904287.jpg
            $new_filename = $info->getFilename();

            $result = [
                'prefix'=>request()->domain().$outer_req_url,//访问前缀
                'source_file_name'=>$source_file_name,
                'file_type'=>$file_type,
                'extension'=>$extension,
                'save_name'=>str_replace('\\', '/', $save_name),
                'new_filename'=>$new_filename,
                'real_path'=>$upload_dir,//物理路径
                'outer_req_url'=>request()->domain().$outer_req_url.'/'.str_replace('\\', '/', $save_name),
                'size'=>$info->getSize(),
            ];
            return Tools::set_result(0, '上传成功', $result);
        }else{
            // 上传失败获取错误信息
            return Tools::set_result(1, $file->getError());
        }
    }

    /**
     * desc：多图
     * author：wh
     * @param string $file_upload_name 表单文件元素name值
     * @param int $size 大小,默认2M
     * @param string $ext 允许的扩展
     * @return array
     */
    static function images($file_upload_name = 'file_upload', $size=10, $ext=''){
        // 获取表单上传文件
        $files = request()->file($file_upload_name);
        $outer_req_url = '/static/upload/image/'.date('Y-m-d');
        $upload_dir = config('app.ROOT_PATH_PRO').'public'.$outer_req_url;
        if(!is_dir($upload_dir)){
            mkdir($upload_dir, 0777, true);
        }

        if(empty($ext)) $ext = self::$img_ext;

        $result = [];
        $error = [];
        foreach($files as $file){
            // 移动到框架应用根目录/uploads/ 目录下
            $info = $file->validate(['size'=>$size * 1024 * 1024, 'ext'=>$ext])->move($upload_dir);
            if($info){
                //原文件名
                $source_file_name = $info->getInfo('name');

                //文件类型
                $file_type = $info->getInfo('type');

                // 输出扩展名 jpg
                $extension = $info->getExtension();

                // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
                $save_name = $info->getSaveName();

                // 输出 42a79759f284b767dfcb2a0197904287.jpg
                $new_filename = $info->getFilename();

                $result[] = [
                    'prefix'=>request()->domain().$outer_req_url,//访问前缀
                    'source_file_name'=>$source_file_name,
                    'file_type'=>$file_type,
                    'extension'=>$extension,
                    'save_name'=>str_replace('\\', '/', $save_name),
                    'new_filename'=>$new_filename,
                    'real_path'=>$upload_dir,//物理路径
                    'outer_req_url'=>request()->domain().$outer_req_url.'/'.str_replace('\\', '/', $save_name),
                    'size'=>$info->getSize(),
                ];
            }else{
                //忽略错误
                // 上传失败获取错误信息
                $error[] = $file->getError();
            }
        }

        $msg = '上传成功';
        $code = 0;
        if(count($error) > 0){
            $msg = '上传失败;提示：'.implode(',', $error);//顺带返回错误信息
            $code = 1;
        }
        return Tools::set_result($code, $msg, $result);
    }


    /**
     * desc：单文件
     * author：wh
     * @param string $file_upload_name 表单文件元素name值
     * @param int $size 大小,默认10M
     * @param string $ext 允许的扩展
     * @return array
     */
    static function file($file_upload_name = 'file_upload', $size=10, $ext=''){
        // 获取表单上传文件 例如上传了001.jpg
        $file = request()->file($file_upload_name);
        // 移动到框架应用根目录/uploads/ 目录下
        $outer_req_url = '/static/upload/file/'.date('Y-m-d');
        $upload_dir = config('app.ROOT_PATH_PRO').'public'.$outer_req_url;
        if(!is_dir($upload_dir)){
            mkdir($upload_dir, 0777, true);
        }
        if(empty($file)){
            return Tools::set_result(1, '上传文件不存在');
        }

        if(empty($ext)) $ext = self::$file_ext;

        $info = $file->validate(['size'=>$size * 1024 * 1024, 'ext'=>$ext])->move($upload_dir);
        if($info){
            //原文件名
            $source_file_name = $info->getInfo('name');

            //文件类型
            $file_type = $info->getInfo('type');

            // 输出扩展名 jpg
            $extension = $info->getExtension();

            // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
            $save_name = $info->getSaveName();

            // 输出 42a79759f284b767dfcb2a0197904287.jpg
            $new_filename = $info->getFilename();

            $result = [
                'prefix'=>request()->domain().$outer_req_url,//访问前缀
                'source_file_name'=>$source_file_name,
                'file_type'=>$file_type,
                'extension'=>$extension,
                'save_name'=>str_replace('\\', '/', $save_name),
                'new_filename'=>$new_filename,
                'real_path'=>$upload_dir,//物理路径
                'outer_req_url'=>request()->domain().$outer_req_url.'/'.str_replace('\\', '/', $save_name),
                'size'=>$info->getSize(),
            ];
            return Tools::set_result(0, '上传成功', $result);
        }else{
            // 上传失败获取错误信息
            return Tools::set_result(1, $file->getError());
        }
    }

    /**
     * desc：多文件
     * author：wh
     * @param string $file_upload_name 表单文件元素name值
     * @param int $size 单文件大小,默认10M
     * @param string $ext 允许的扩展
     * @return array
     */
    static function files($file_upload_name = 'file_upload', $size=10, $ext=''){
        // 获取表单上传文件
        $files = request()->file($file_upload_name);
        $outer_req_url = '/static/upload/file/'.date('Y-m-d');
        $upload_dir = config('app.ROOT_PATH_PRO').'public'.$outer_req_url;
        if(!is_dir($upload_dir)){
            mkdir($upload_dir, 0777, true);
        }

        if(empty($ext)) $ext = self::$file_ext;

        $result = [];
        $error = [];
        foreach($files as $file){
            // 移动到框架应用根目录/uploads/ 目录下
            $info = $file->validate(['size'=>$size * 1024 * 1024, 'ext'=>$ext])->move($upload_dir);
            if($info){
                //原文件名
                $source_file_name = $info->getInfo('name');

                //文件类型
                $file_type = $info->getInfo('type');

                // 输出扩展名 jpg
                $extension = $info->getExtension();

                // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
                $save_name = $info->getSaveName();

                // 输出 42a79759f284b767dfcb2a0197904287.jpg
                $new_filename = $info->getFilename();

                $result[] = [
                    'prefix'=>request()->domain().$outer_req_url,//访问前缀
                    'source_file_name'=>$source_file_name,
                    'file_type'=>$file_type,
                    'extension'=>$extension,
                    'save_name'=>str_replace('\\', '/', $save_name),
                    'new_filename'=>$new_filename,
                    'real_path'=>$upload_dir,//物理路径
                    'outer_req_url'=>request()->domain().$outer_req_url.'/'.str_replace('\\', '/', $save_name),
                    'size'=>$info->getSize(),
                ];
            }else{
                //忽略错误
                // 上传失败获取错误信息
                $error[] = $file->getError();
            }
        }
        $msg = '上传成功';
        $code = 0;
        if(count($error) > 0){
            $msg = '上传失败;提示：'.implode(',', $error);//顺带返回错误信息
            $code = 1;
        }
        return Tools::set_result($code, $msg, $result);
    }


    /**
     * desc：上传base64格式图片【文件不用base64传输】
     * author：wh
     * @param string $file_upload_name
     * @param int $size
     * @param array $ext
     * @return array
     * @throws \Exception
     */
    static function uploadBase64Img($file_upload_name = 'file_upload', $size=10, $ext=''){
        $source = input($file_upload_name, 'file_upload');
        $file_size = strlen($source);
        if($file_size > $size * 1024 * 1024){
            return Tools::set_result(1, '上传失败，大小限制');
        }
        if(preg_match('/^(data:\s*image\/(\w+);base64,)/', $source, $result) < 1){
            return Tools::set_result(1, '上传文件不合法');
        }
        $type = $result[2];

        if(empty($ext)) $ext = self::$file_ext;

        if(!in_array($type, explode($ext))){
            return Tools::set_result(1, '上传失败，类型限制');
        }
        $result = base64_image_content($source);
        if(false === $result){
            return Tools::set_result(1, '上传失败');
        }
        return Tools::set_result(0, '上传成功', $result);
    }

    /**
     * desc：批量上传base64格式图片【文件不用base64传输】
     * author：wh
     * @param string $file_upload_name
     * @param int $size
     * @param array $ext
     * @return array
     * @throws \Exception
     */
    static function uploadBase64Imgs($file_upload_name = 'file_upload', $size=10, $ext=''){
        $source_list = input($file_upload_name, 'file_upload');
        if(!is_array($source_list)){
            return Tools::set_result(1, '参数错误');
        }

        if(empty($ext)) $ext = self::$file_ext;

        $result = [];
        $error = [];
        foreach ($source_list as $source){
            $file_size = strlen($source);
            if($file_size > $size * 1024 * 1024){
                $error[] = '上传失败，大小限制';
                continue;
            }
            if(preg_match('/^(data:\s*image\/(\w+);base64,)/', $source, $temp) < 1){
                $error[] = '上传文件不合法';
                continue;
            }
            $type = $temp[2];
            if(!in_array($type, explode(',', $ext))){
                $error[] = '类型限制';
                continue;
            }
            $up_result = base64_image_content($source);
            if(false === $up_result){
                $error[] = '上传失败';
                continue;
            }
            $result[] = $up_result;
        }

        $msg = '上传成功';
        $code = 0;
        if(count($error) > 0){
            $msg = '上传失败;提示：'.implode(',', $error);//顺带返回错误信息
            $code = 1;
        }
        return Tools::set_result($code, $msg, $result);
    }
}